package beanDefinitionReader;

import beanDefinition.BeanDefinition;
import beanDefinition.MultablePropertyValues;
import beanDefinition.PropertyValue;
import beanDefinitionRegistry.BeanDefinitionRegistry;
import beanDefinitionRegistry.SimpleBeanDefinitionRegistry;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.util.List;

//针对xml配置文件进行解析的类
public class XmlBeanDefinitionReader implements BeanDefinitionReader{
    //声明注册表对象
    private BeanDefinitionRegistry registry;

    //构造函数里面进行赋值
    public XmlBeanDefinitionReader()
    {
      registry=new SimpleBeanDefinitionRegistry();
    }

    @Override
    public BeanDefinitionRegistry getRegistry()
    {
        return registry;
    }

    //只实现类路径下的配置文件加载
    @Override
    public void loadBeanDefinitions(String configLocation) throws Exception {
         //使用dom4j进行xml配置文件的解析
        SAXReader reader=new SAXReader();
        //获取类路径下的配置文件
        InputStream is = XmlBeanDefinitionReader.class.getClassLoader().getResourceAsStream(configLocation);
        //传入字节输入流，获取文档对象
        Document document = reader.read(is);
        //根据Document对象获取根标签对象(beans)
        Element rootElement=document.getRootElement();
        //获取根标签下所有的bean标签对象
        List<Element> beanElements = rootElement.elements("bean");
        //遍历集合--获取每个bean标签上的属性值
        for (Element beanElement : beanElements) {
            //获取id属性
            String id = beanElement.attributeValue("id");
            //获取class属性
            String className = beanElement.attributeValue("class");
            //将id属性和class属性封装到BeanDefinition对象中
            //1.创建BeanDefinition对象
            BeanDefinition beanDefinition=new BeanDefinition();
            beanDefinition.setId(id);
            beanDefinition.setClassName(className);

            //创建MultablePropertyValues对象
            MultablePropertyValues multablePropertyValues=new MultablePropertyValues();

            //获取bean标签下所有的property标签对象
            List<Element> propertyElements = beanElement.elements("property");
            for (Element propertyElement : propertyElements) {
                //获取name属性
                String name = propertyElement.attributeValue("name");
                //获取ref属性
                String ref = propertyElement.attributeValue("ref");
                //获取value属性
                String value = propertyElement.attributeValue("value");
                //使用PropertyValue对象封装上述属性
                PropertyValue propertyValue=new PropertyValue(name,ref,value);
                //添加到管理PropertyValue对象的容器中
                multablePropertyValues.addPropertyValue(propertyValue);
            }
         //将multablePropertyValues对象封装到BeanDefinition对象中
            beanDefinition.setPropertyValues(multablePropertyValues);

         //将beanDefinition对象注册到注册表中
         //xml文件中配置的id做为管理BeanDefinition对象的容器中的名字
            registry.registerBeanDefinition(id,beanDefinition);
        }
    }
}
